#include <iostream>
#include<string.h>
using namespace std;

//class Solution {
//        public:
//        //基数排序呃的思维
//        int firstUniqChar(string s)
//        {
//            int  arr[26]={0};
//            string::iterator itB=s.begin();
//            while(itB!=s.end())
//            {
//                arr[*itB-'a']+=1;
//                itB++;
//            }
//            itB=s.begin();
//            while(itB!=s.end())
//            {
//                if(arr[*itB-'a']==1)
//                {
//                    return s.find(*itB);
//                }
//                itB++;
//            }
//
//
//            return -1;
//
//        }
//};
class Solution {
public:
    bool IfChar(char ch )
    {
        if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
        {
            return true;
        }
        return false ;
    }

    bool isPalindrome(string s)
    {
        if(s.empty())
            return true;



        string::iterator itB=s.begin();
        string::iterator itE=s.end()-1;
        while(itB<itE)
        {
            while(itB<itE&&!IfChar(*itB))
            {
                itB++;
            }
            while(itB<itE&&!IfChar(*itE))
            {
                itE--;
            }
            if(itB<itE)
            {
                if(*itB==*itE||*itB==(*itE+32)||*itB==(*itE-32))
                {

                    //如果itE+32 or-32如果他原来是数字就会导致出错
                    itB++;
                    itE--;
                }
                else
                {

                    return false;
                }
            }

        }
        return true;
    }
};
int main()
{
    Solution d1;
    string a1("A man, a plan, a canal: Panama");
     cout<<  d1.isPalindrome(a1);


    cout<<string("amanaplanacanalpanama").size();
}